package org.feifei.hrm.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import org.feifei.hrm.domain.CourseType;
import org.feifei.hrm.mapper.CourseTypeMapper;
import org.feifei.hrm.service.ICourseTypeService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.feifei.hrm.vo.CrumbsVo;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author feifei
 * @since 2022-01-06
 */
//@Service
public class CourseTypeServiceImpl_springCache版本 extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    private static  final  String COURSETYPE_TREEDATA_IN_CACHEB = "courseType_treeData_in_cache";//redis的key

    @Resource
    private RedisTemplate redisTemplate;

    @Resource
    private CourseTypeMapper courseTypeMapper;

    @Override
    @Cacheable(cacheNames = COURSETYPE_TREEDATA_IN_CACHEB,key = "'ALL'") // 开启缓存支持
    public List<CourseType> getTree(Long pid) {
        // 第一种方式，通过java递归调用
//         return loadRecursionById(pid);
        // 方案二 mysql中循环调用
//      return courseTypeMapper.getTree(pid);
        // 第三种方案，循环遍历

        return getByLoop(pid);
    }

    @Override
    public List<CrumbsVo> queryCrumbs(Long typeId) {
        return null;
    }

    private List<CourseType> getByLoop(Long pid) {
        List<CourseType> courseTypes = courseTypeMapper.selectList(null);
        Map<Long, CourseType> map = new HashMap<>();
        List<CourseType> list = new ArrayList<>();
        courseTypes.forEach(courseType -> map.put(courseType.getId(), courseType));
        courseTypes.forEach(courseType -> {
            if (courseType.getPid() == pid) {
                list.add(courseType);
            } else {
                CourseType parent = map.get(courseType.getPid());
                parent.getChildren().add(courseType);
            }
        });

        return list;
    }

    public List<CourseType> loadRecursionById(Long id) {
        List<CourseType> courseTypes = courseTypeMapper.selectList(new EntityWrapper<CourseType>().eq("pid", id));

        if (courseTypes == null || courseTypes.size() < 1) {
            return null;
        }
        courseTypes.forEach(courseType -> {
            List<CourseType> courseTypeChilds = loadRecursionById(courseType.getId());
            courseType.setChildren(courseTypeChilds);
        });
        return courseTypes;
    }

    // SpringCache删除缓存, 字段范围ALL，
    // beforeInvocation = false 是否是先操作缓存，默认是false，先操作数据库再操作缓存
    @CacheEvict(cacheNames = COURSETYPE_TREEDATA_IN_CACHEB,key = "'ALL'", beforeInvocation = false)
    @Override
    public boolean updateById(CourseType entity) {
        CourseType courseType = super.selectById(1L);
        courseType.setName(courseType.getName() + "===>");
        return super.updateById(courseType);
    }
}
